﻿//******************************************************************
//  utils.h
//  Libreria de utilizades externas para MDDipolar.cpp
//	Grupo de Fisica de Fluidos y Biocoloides - Univers. de Granada
//  ©2011, Dr. Juan Carlos Fernandez Toledano
//******************************************************************
/** Mathematically rounds 'double'-typed x, returning 'double'. */
inline double dround(double x) { return floor(x+0.5); }

/** Calculates the SQuaRe of 'double' x, returning 'double'. */
inline double SQR(double x) { return x*x; }

class parametros
{
private:
public:
	parametros()
	{
	}
	//Numero de particulas
	int npart;
	//Fraccion en volumen
	double phi;
	//Alcance del potencial de esfera dura
	double rcut;
	//Paso de tiempo de la simulacion
	double Dt;
	//Intensidad del campo magnetico
	double u0;
	//Reinicio de la simulacion
	int rest;
	//Numero de canales de los correladores
	int ncorr;
	//Tiempo de relajacion del primer canal
	double trelaj1;
	//Directorio de trabajo
	char dir[50];
	//Nombre del fichero del tensor de esfuerzos
	char stressFile[70];
	//Nombre del fichero de resultados
	//char resFile[70];
	//Nombre del archivo de configuraciones
	char confFile[70];
	//Nombre del archivo de reinicio de la simulacion
	//char iniFile[70];
	//Nombre del archivo del correlador
	char corrFile[70];
	//Altura de la caja en radios
	double h0;
	/*shear rate*/
	//double shear;
	char dummy[20];

	void importConfig(void);
	void setValues(char *name, char*value);
	void split(char *cadena, char *name, char *value, char *descrp);
	void printConfig(void);
};



void parametros::importConfig(void)
{
	char line[250];
	char namefile[500];
	char strName[25], strValue[20],strDescrp[200];

	//Nombre del fichero de configuracion
	strcpy (namefile,"config.ini");
	ifstream MiArchivo (namefile,ios::in);
	if(MiArchivo.fail())
	{
		//No se encontro archivo de inicio
		cout<<"No fue posible encontrar el archivo 'config.ini'"<<endl;
		exit(1);
	}
	if (MiArchivo.is_open())
	{
		while(!MiArchivo.eof())
		{

stringstream ss;
string s;

			MiArchivo.getline(line,250);
			ss<<line;
			ss>>s;
			if(int(line[0])!=0) {

			split( line,strName,strValue,strDescrp);
			setValues(strName, strValue);
			}
		}
		MiArchivo.close();
	}
}

void parametros::split(char *cadena, char *name, char *value, char *descrp)
{
	int ind1, ind2, index, len;
	char *pch;
	pch=strchr(cadena,':');
	ind1 =pch-cadena+1;
	pch=strchr(cadena,';');
	ind2 =pch-cadena+1;
	len=strlen(cadena);


	if(ind1>0&&ind2>0)
	{
		index=0;
		for(int i=0;i<ind1-1;i++)
		{
			if(cadena[i]!=' ')
			{
				name[index]=cadena[i];
			}
			index++;
		}
		name[index]=0;

		index=0;
		for(int i=ind1;i<ind2-1;i++)
		{
			if((cadena[i]!=' ') && (cadena[i]!=0x09))
			{
				value[index]=cadena[i];
				index++;
			}

		}
		value[index]=0;

		index=0;
		for(int i=ind2;i<len;i++)
		{
			descrp[index]=cadena[i];
			index++;
		}
		descrp[index]=0;
	}
}

void parametros::setValues(char *name, char*value)
{

	if (strcmp(name, "hbox")==0)
	{
		double hh = atof(value);
		h0=hh;
	}
	else if (strcmp(name, "npart")==0)
	{
		int np = atoi(value);
		npart=np;
	}
	else if (strcmp(name, "phi")==0)
	{
		double ph = atof(value);
		phi=ph;
	}
//	else if (strcmp(name, "shear")==0)
//	{
//		double sh = atof(value);
//		shear=sh;
//	}
	else if (strcmp(name, "rcut")==0)
	{
		double rc = atof(value);
		rcut=rc;
	}
	else if (strcmp(name, "Dt")==0)
	{
		double D = atof(value);
		Dt=D;
	}
	else if (strcmp(name, "u0")==0)
	{
		double uu0 = atof(value);
		u0=uu0;
	}
	else if (strcmp(name, "restart")==0)
	{
		int re =(atoi(value));
		rest=re;
	}
	else if (strcmp(name, "ncorr")==0)
	{
		int nco =(atoi(value));
		ncorr=nco;
	}
	else if (strcmp(name, "t1")==0)
	{
		double val =(atof(value));
		trelaj1=val;
	}
	else if (strcmp(name, "dir")==0)
	{
		strcpy (dir,value);
	}
	else if (strcmp(name, "stressFile")==0)
	{
		sprintf(stressFile,"%s%s",dir,value);
	}
//	else if (strcmp(name, "resFile")==0)
//	{
//		sprintf(resFile,"%s%s",dir,value);
//	}
	else if (strcmp(name, "confFile")==0)
	{
		sprintf(confFile,"%s%s",dir,value);
	}
//	else if (strcmp(name, "iniFile")==0)
//	{
//		sprintf(iniFile,"%s%s",dir,value);
//	}
	else if (strcmp(name, "corrFile")==0)
	{
		sprintf(corrFile,"%s%s",dir,value);
	}
	else
	{
		cout<<"Parametro de configuracion no reconocido por el sistema: "<<name<<endl;
	}
}

void parametros::printConfig(void)
{
	void centerstring(char* s);
	cout.precision(3);
	centerstring("Parametros de la simulacion");
	cout.setf(ios::fixed);
	cout.fill('+');
	cout << setw(80) << "";
	cout<<"Npart: "<<npart<<endl;
	cout<<"Fraccion en volumen: "<< phi<<endl;
	cout<<"Alcance del potencial: "<<rcut<<endl;
	cout<<"Paso de tiempo de las simulaciones: "<<Dt<<endl;
	cout<<"Reinicio de la simulacion: "<<rest<<endl;
	cout<<"Numero de canales de los correladores: "<<ncorr<<endl;
	cout<<"Tiempo de relajacion del primer canal: "<<trelaj1<<endl;
	cout<<"Directorio de trabajo: "<<dir<<endl;
	cout<<"Fichero del tensor de esfuerzos: "<<stressFile<<endl;
	//cout<<"Fichero de resultados: "<<resFile<<endl;
	cout<<"Fichero de configuraciones: "<<confFile<<endl;
	//cout<<"Fichero de reinicio: "<<iniFile<<endl;
	cout<<"Fichero del correlador: "<<corrFile<<endl;
	cout << setw(80) << "";
}

void centerstring(char* s)
{
	int l=strlen(s);
	int pos=(int)((80-l)/2);
	for(int i=0;i<pos;i++)
		cout<<" ";
	cout<<s<<endl;
}


void formatString(char* s1, char* s2)
{
	int l=strlen(s1);
	int pos=(int)(50-l);
	cout<<s1;
	for(int i=0;i<pos;i++)
		cout<<" ";
	cout<<s2<<endl;
}

void printTilte(void)
{
	int ancho = 80;
	cout.setf(ios::fixed);
	cout.fill('*');
	cout << setw(ancho) << "";
	centerstring("Simulacion fluido dipolar");
	centerstring("bajo un campo externo");
	cout.fill('-');
	cout << setw(ancho) << "";
	centerstring("Dr. Juan Carlos Fernandez Toledano");
	centerstring("Grupo de Fisica de Fluidos y Biocoloides");
	centerstring("2011 - Universidad de Granada");
	cout.fill('*');
	cout << setw(ancho) << "" << endl;
}
